package cn.okcode.slowjson;

import org.apache.commons.lang.StringUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 扩展记录的版本对象
 * 版本格式：主对象编号_视图_版本_对象oid，示例：0000000790_2890_A.7_385491
 * <p>
 */
public class ExtRecordVersionIdentifier {
    /**
     * 主对象编号 eg. 0000000780
     */
    private final String number;

    /**
     * 主对象视图 eg. 2890
     */
    private final String viewName;

    /**
     * 主对象版本，eg. A.7
     */
    private final String version;

    /**
     * 主对象版本，eg. A.7
     * <p>
     * 为什么要加上对象oid？举例解释：
     * 当工序是A.6版本，然后检出修改再进入变成了A.7版本，此时 检验标准版本 属性记录的还是A.6
     * 然后为A.7工序增加几条 检验标准记录，此时 会复制一份A.6的检验记录并新增产生A.7的校验记录
     * 然后再撤销检出A.7工序，此时A.7的工序再次关联到A.6的校验记录
     * 然后再检出A.7工序并编辑检验记录，此时 后台尝试升级A.6校验记录版本，则会复制一份A.6检验记录为A.7，然后和之前的A.7就重复了
     */
    private final long stamp;

    public static final long TIME_MILLIS_OF_2020;

    static {
        long l = 50;
        TIME_MILLIS_OF_2020 = l * 365 * 24 * 60 * 60 * 1000;
    }

    public ExtRecordVersionIdentifier(String number, String viewName, String version, long stamp) {
        this.number = number;
        this.viewName = viewName;
        this.version = version;
        this.stamp = stamp;
        System.out.println("number: " + number);
        System.out.println("viewName: " + viewName);
        System.out.println("version: " + version);
        System.out.println("stamp: " + stamp);
    }

    public static ExtRecordVersionIdentifier fromValue(String versionId) {
        System.out.println("----" + versionId + "----");
        if (StringUtils.isBlank(versionId)) {
            throw new RuntimeException("versionId不能为空");
        }
        final char SPLIT_CHAR = '_';
        String[] arr = StringUtils.split(versionId, SPLIT_CHAR);
        //版本id由四部分组成
        if (arr.length < 4) {
            throw new RuntimeException("扩展版本id格式不对");
        }
        List<String> numbers = new ArrayList<>(Arrays.asList(arr).subList(0, arr.length - 3));
        String number = StringUtils.join(numbers, SPLIT_CHAR);
        String viewName = arr[arr.length - 3];
        String version = arr[arr.length - 2];
        long timeMillis = Long.parseLong(arr[arr.length - 1]);
        return new ExtRecordVersionIdentifier(number, viewName, version, timeMillis);
    }

    /**
     * 当前时间到1970+20即2020年开始的毫秒数
     *
     * @return 当前时间到2020年的时间毫秒数
     */
    private long currentTimeMillisFrom2020() {
        return System.currentTimeMillis() - TIME_MILLIS_OF_2020;
    }

    public String getValue() {
        return number + "_" + viewName + "_" + version + "_" + stamp;
    }

    public String getVersion() {
        return version;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof ExtRecordVersionIdentifier)) {
            return false;
        }
        ExtRecordVersionIdentifier other = (ExtRecordVersionIdentifier) obj;
        return getValue().equals(other.getValue());
    }

    @Override
    public int hashCode() {
        return getValue().hashCode();
    }

    @Override
    public String toString() {
        return getValue();
    }
}
